`
https://leetcode.cn/problems/longest-univalue-path/
`

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number}
 */
var longestUnivaluePath = function (root) {
  if (root === null) return 0
  let res = 0

  const maxLen = (root, parentVal) => {
    if (root === null) return 0

    // 获取每个子树的最长相同结点路径的长度
    const leftMaxLen = maxLen(root.left, root.val)
    const rightMaxLen = maxLen(root.right, root.val)

    // 更新最大值
    res = Math.max(res, leftMaxLen + rightMaxLen)

    // 如果结点值和父节点值不同，则该子树不存在与父节点值相同且连通的结点了
    // 子树里原本符合条件的路径已经记录在 res 里面了
    if (root.val !== parentVal) {
      return 0
    }

    return 1 + Math.max(leftMaxLen, rightMaxLen)
  }

  maxLen(root, root.val)

  return res
};